package vetxsoft.bean;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import vetxsoft.entity.Cliente;
import vetxsoft.entity.DetalleVacunacion;
import vetxsoft.entity.DetalleVacunacionPK;
import vetxsoft.entity.HistoriaClinica;
import vetxsoft.entity.Vacunacion;
import vetxsoft.system.IVetexsoftSystem;

/**
 *
 * @author Nother
 */
@ManagedBean
@SessionScoped
public class VacunacionBean {

    @EJB
    private IVetexsoftSystem vetexsoftSystem;
    private Vacunacion vacunacion = new Vacunacion();
    private DetalleVacunacion detalleVacunacion = new DetalleVacunacion();
    private LinkedList<DetalleVacunacion> detalleVacunacions = new LinkedList<DetalleVacunacion>();
    private HistoriaClinica historiaClinica = new HistoriaClinica();
    private Cliente cliente;
    private Date currentDate = new Date();
    private boolean stored = false;
    private boolean editVacuna = false;

    public Date getCurrentDate() {
        return currentDate;
    }

    public Vacunacion getVacunacion() {
        return vacunacion;
    }

    public void setVacunacion(Vacunacion vacunacion) {
        this.vacunacion = vacunacion;
    }

    public LinkedList<DetalleVacunacion> getDetalleVacunacions() {
        return detalleVacunacions;
    }

    public void setDetalleVacunacions(LinkedList<DetalleVacunacion> detalleVacunacions) {
        this.detalleVacunacions = detalleVacunacions;
    }

    public DetalleVacunacion getDetalleVacunacion() {
        return detalleVacunacion;
    }

    public void setDetalleVacunacion(DetalleVacunacion detalleVacunacion) {
        this.detalleVacunacion = detalleVacunacion;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public HistoriaClinica getHistoriaClinica() {
        return historiaClinica;
    }

    public void setHistoriaClinica(HistoriaClinica historiaClinica) {
        this.historiaClinica = historiaClinica;
    }

    public boolean isStored() {
        return stored;
    }

    public void setStored(boolean stored) {
        this.stored = stored;
    }

    public boolean isEditVacuna() {
        return editVacuna;
    }

    public void setEditVacuna(boolean editVacuna) {
        this.editVacuna = editVacuna;
    }

    public IVetexsoftSystem getVetexsoftSystem() {
        return vetexsoftSystem;
    }

    public void cancelSelectionCliente() {

        this.cliente = (null);
    }

    public void cancelSelectionProducto() {

        this.detalleVacunacion.setProducto(null);
    }

    public void returnDetalle() {

        this.detalleVacunacions.remove(detalleVacunacion);
        this.detalleVacunacion = new DetalleVacunacion();
    }

    public void addDetalleAction() {

        if (this.detalleVacunacion.getCantidad() <= 0) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "La cantidad no puede ser menor o igual a cero.", ""));
            return;
        }

        if (this.detalleVacunacion.getProducto() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar una cantidad.", ""));
            return;
        }
//
//        if (this.detalleVacunacions.contains(detalleVacunacion) && this.editVacuna) {
//
//            this.detalleVacunacions.remove(detalleVacunacion);
//        }

        for (DetalleVacunacion dv : this.detalleVacunacions) {
            if (dv.getProducto().getDescripcion().equalsIgnoreCase(this.detalleVacunacion.getProducto().getDescripcion())) {

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Esta vacuna ya ha sido ingresada. Debes seleccionar otra.", ""));
                return;
            }
        }

        this.detalleVacunacions.add(detalleVacunacion);

        this.detalleVacunacion = new DetalleVacunacion();
        this.editVacuna = false;
    }

    public void cancelAction() {

        this.vacunacion = new Vacunacion();
        this.detalleVacunacion = new DetalleVacunacion();
        this.detalleVacunacions = new LinkedList<DetalleVacunacion>();
        this.cliente = null;
        this.historiaClinica = new HistoriaClinica();
        this.stored = false;
    }

    public void saveAction() {
        try {

//            if (this.historiaClinica.getCodMascota() == null) {
//                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar un cliente.", ""));
//                return;
//            }
            

            if (this.detalleVacunacions.isEmpty()) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar un producto.", ""));
                return;
            }

            // guardamos la vacunacion
            this.vacunacion.setStored(this.stored);
            this.vetexsoftSystem.saveVacunacion(this.vacunacion);

            // obtenemos la ultima vacunacion guardada, la cual nos proporcionará el codigo generado automaticamente
            List<Vacunacion> facturas = this.vetexsoftSystem.obtenerVacunacion();
            this.vacunacion = facturas.get(facturas.size() - 1);

            // guardamos la historia clinica
            this.vetexsoftSystem.saveHistoriaClinica(this.historiaClinica);

            // guardamos todos los detalles de vacunacion registrados
            for (DetalleVacunacion dv : this.detalleVacunacions) {

                dv.setDetalleVacunacionPK(new DetalleVacunacionPK(this.vacunacion.getCodigo(), dv.getProducto().getCodigo()));
                this.vetexsoftSystem.saveDetalleVacunacion(dv);
            }

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "La vacunacion ha sido registrada satisfactoriamente.", ""));

            this.vacunacion = new Vacunacion();
            this.detalleVacunacion = new DetalleVacunacion();
            this.detalleVacunacions = new LinkedList<DetalleVacunacion>();
            this.cliente = null;
            this.historiaClinica = new HistoriaClinica();
            this.stored = false;

        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha podido registrar la vacunacion. Por favor, vuelva a intentarlo.", ""));
        }
    }

    public void removeAction() {
        try {

            this.vacunacion.setStored(this.stored);
            this.vetexsoftSystem.removeVacunacion(this.vacunacion);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "La vacunacion ha sido eliminada satisfactoriamente.", ""));

            this.vacunacion = new Vacunacion();
            this.stored = false;
            this.detalleVacunacion = new DetalleVacunacion();

        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha podido eliminar la vacunacion. Por favor, vuelva a intentarlo.", ""));
        }
    }
}
